package org.db.ui;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.SortedSet;

import javax.swing.table.AbstractTableModel;

import org.db.dao.LageskizzenGVPDAO;

public class LageskizzenGVPTableModel extends AbstractTableModel {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1096576239971373659L;

	private List<LageskizzenGVPDAO> data = new ArrayList<LageskizzenGVPDAO>();

	private DecimalFormat format1 = new DecimalFormat("0.000");

	private DecimalFormat format2 = new DecimalFormat("0");

	Class<?>[] types = new Class[]{java.lang.String.class,
			java.lang.Double.class, java.lang.Integer.class,
			java.lang.Double.class, java.lang.String.class,
			java.lang.Double.class, java.lang.Integer.class,
			java.lang.Double.class, java.lang.Double.class,
			java.lang.Double.class};

	@Override
	public int getColumnCount() {
		return 10;
	}

	@Override
	public int getRowCount() {
		return data.size();
	}

	@Override
	public Object getValueAt(int row, int column) {
		switch (column) {
			case 0 :
				return data.get(row).getpunktNrGVPLinks();
			case 1 :
				return data.get(row).getstationGVPLinks() == 0 ? "" : format1
						.format(data.get(row).getstationGVPLinks());
			case 2 :
				return data.get(row).getquerGVPLinks() == 0 ? "" : format1
						.format(data.get(row).getquerGVPLinks());
			case 3 :
				return data.get(row).gethoehenmaßGVPLinks() == 0 ? "" : format2
						.format(data.get(row).gethoehenmaßGVPLinks());
			case 4 :
				return data.get(row).getpunktNrGVPRechts();
			case 5 :
				return data.get(row).getstationGVPRechts() == 0 ? "" : format1
						.format(data.get(row).getstationGVPRechts());
			case 6 :
				return data.get(row).gethoehenmaßGVPRechts() == 0
						? ""
						: format2.format(data.get(row).gethoehenmaßGVPRechts());
			case 7 :
				return data.get(row).getquerGleisLinks() == 0 ? "" : format1
						.format(data.get(row).getquerGleisLinks());
			case 8 :
				return data.get(row).getquerGleisRechts() == 0 ? "" : format1
						.format(data.get(row).getquerGleisRechts());
			case 9 :
				return data.get(row).getgleisabstand() == 0 ? "" : format1
						.format(data.get(row).getgleisabstand());
			default :
				return "";
		}
	}

	@Override
	public void setValueAt(Object value, int rowIndex, int columnIndex) {
		LageskizzenGVPDAO dao = data.get(rowIndex);
		switch (columnIndex) {
			case 0 :
				dao.setpunktNrGVPLinks((String) value);
				break;
			case 1 :
				dao.setstationGVPLinks((Double) value);
				break;
			case 2 :
				dao.setquerGVPLinks((Double) value);
				break;
			case 3 :
				dao.sethoehenmaßGVPLinks((Integer) value);
				break;
			case 4 :
				dao.setpunktNrGVPRechts((String) value);
				break;
			case 5 :
				dao.setstationGVPRechts((Double) value);
				break;
			case 6 :
				dao.sethoehenmaßGVPRechts((Integer) value);
				break;
			case 7 :
				dao.setquerGleisLinks((Double) value);
				break;
			case 8 :
				dao.setquerGleisRechts((Double) value);
				break;
			case 9 :
				dao.setgleisabstand((Double) value);
				break;
		}
		fireTableCellUpdated(rowIndex, columnIndex);
	}

	@Override
	public String getColumnName(int column) {
		switch (column) {
			case 0 :
				return "PktNr_GVP_Li";
			case 1 :
				return "Station_GVP_Li";
			case 2 :
				return "Quer_GVP_Li";
			case 3 :
				return "Höhenmaß_GVP_Li";
			case 4 :
				return "PktNr_GVP_Re";
			case 5 :
				return "Station_GVP_Re";
			case 6 :
				return "Höhenmaß_GVP_Re";
			case 7 :
				return "Quer_Li_Gleis";
			case 8 :
				return "Quer_Re_Gleis";
			case 9 :
				return "Gleisabstand";
			default :
				return "";
		}
	}

	@Override
	public boolean isCellEditable(int row, int column) {
		return false;
	}

	@Override
	public Class<?> getColumnClass(int columnIndex) {
		return types[columnIndex];
	}

	public void addLageskizzenGVP(LageskizzenGVPDAO dao) {
		data.add(dao);
		Collections.sort(data);
		fireTableDataChanged();
	}

	public void addLageskizzenGVPs(List<LageskizzenGVPDAO> daos) {
		data.addAll(daos);
		Collections.sort(data);
		fireTableDataChanged();
	}

	public void setLageskizzenGVPs(List<LageskizzenGVPDAO> daos) {
		data.clear();
		data.addAll(daos);
		Collections.sort(data);
		fireTableDataChanged();
	}

	public void replaceGVPElement(LageskizzenGVPDAO oldDao,
			LageskizzenGVPDAO newDao) {
		data.set(data.indexOf(oldDao), newDao);
		fireTableDataChanged();
	}

	public void removeGVPElement(LageskizzenGVPDAO dao) {
		data.remove(dao);
		fireTableDataChanged();
	}

	public LageskizzenGVPDAO removeGVPElement(int rowIndex) {
		LageskizzenGVPDAO removedDAO = data.remove(rowIndex);
		fireTableDataChanged();
		return removedDAO;
	}

	public LageskizzenGVPDAO getElementAtRow(int row) {
		if (row < data.size()) {
			return data.get(row);
		}
		return null;
	}

	public void addLageskizzenGVPs(SortedSet<LageskizzenGVPDAO> daos) {
		data.addAll(daos);
		fireTableDataChanged();
	}

	public List<LageskizzenGVPDAO> getGVPElemente() {
		return data;
	}

	public void refresh() {
		fireTableDataChanged();
	}

	public boolean isEmpty() {
		return data.isEmpty();
	}

	public void clear() {
		data.clear();
	}

}
